//
//  main.m
//  C05_函数
//
//  Created by dllo on 15/11/23.
//  Copyright © 2015年 dllo. All rights reserved.
//


#import <Foundation/Foundation.h>
      /** 函数的语法 */
#pragma mark - 知识点1 函数分类
/** 函数分库函数(系统提供的函数)
 *  自定义函数(开发者自己编写的函数)
 */

/** 函数的语法 
 *  返回值类型 函数名(形式参数列表) {
        
           语句
           return 返回值, 注意:返回值类型要和函数开头部分的返回值类型一致
 }
 */

/** 1. 无返回值,无参数的函数 */

void printHello() {
    
    printf("Hello,World!");
    return; /* 对于无返回值类型的函数,retur通常省略,但是如果加上return,是可以的,但是return后面的语句不执行 */
}
/** 2. 无返回值,有参数的函数 */
    void printNumber(int x, int y) {
        
        printf("%d%d", x, y);
        
        
    }
    
/** 3. 有返回值,无参数 */
int numberTen() {
    printf("有返回值无参数的函数");
    return 10;/* 注意: 对于有返回值类型的函数, 必须有返回值,且返回值类型一致*/
    
};
/** 4.有返回值,有参数的函数*/
int sum(int x,int y) {
    
    return x+y;
}


#pragma mark - 练习
/** 1. 定义求两个整形数的最大值,并且把最大值返回给主调函数*/

int max(int x, int y) {
    
    return x > y ? x : y;
}
/** (2). 定义求两个整型数的和，在该函数中打印和，不用把和返回给主调函数 */
void sumNumber(int x, int y){
    printf("sum = %d\n",x + y);
}
/** (3). 编写函数int sumValue(int n)：计算1到n的和 */

int sumValue(int n) {
    int sum = 0;
    for (int i = 0; i < n; i++) {
        sum = (i + 1);
    }
    return sum;
}
/** (5). 编写函数，返回正整数n中的数字的个数 */
int Number(int n){
    int sum = 0;
    do {
        sum++;
    } while (n/=10);
    return sum;
}


#pragma mark - 知识点2 函数声明和定义
/** 函数的声明 
 * 后面有分号
 * 函数的声明,其中参数列表部分,参数名可以省略
 */
int min(int x, int y);
int min2(int, int);

/** 函数的实现(定义) 
 * 函数的实现,其中参数列表部分,参数名必须有
 */
int min(int x, int y){

return x<y?x:y;
}
int min2 (int x, int y){
    return x<y?x:y;
}
void down();
/** 在工程中,通常是将函数的声明和实现单独放在不同的文件中, 目的: 解耦和查看方便 
 * 详见,"C05_2函数" 工程
 */





#pragma mark - 练习




#pragma mark - 知识点4 形参实参
/** 注意   函数调用时,形参会拷贝实参内容, 单向传递,  实参传给形参
 * 详见"C05_2函数"工程
 */

/** 练习   写一个交换两个整型变量值的函数 详见C05_2函数 */


#pragma mark - 5.练习

/*1，求两个数的最大值；
2，求三个数的最大值；
3，求四个数的最大值；
4，求五个数的最大值；*/









int main(int argc, const char * argv[]) {

    
#pragma mark - 知识点3 函数调用
    /** 1.调用系统函数. printf()*/
    printf("调用系统函数!\n");
    
    /** 2.调用自定义函数 */
    printHello();
    printNumber(3, 5);
    numberTen();
    int a = numberTen();
    printf("a = %d\n",a);
    
    sum(3,5);
    printf("sum = %d\n",sum(3, 5));
    
    printf("max = %d\n", max(3, 5));
    
    sumNumber(3, 5);
    
    printf("sum = %d\n", sumValue(5));
    
    printf("%d",Number(202));

    /** 3.*/
    
    
#pragma mark 知识点5 函数嵌套调用
    
    
    
    
    
    
    return 0;
}


#pragma mark 主函数的下方
void down(){
    printf("在主函数的下方!\n");
}


